import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class MainOptiCombi {

	private static void afficherAide() {
		System.out
				.println("Utilisation : MainOptiCombi.jar <idHeuristique> <instances> <fichierParamsOptionnel>");
		System.out.println(" Choix pour idHeuristique :");
		System.out.println("   1 : Heuristique gloutonne LPT");
		System.out.println("   2 : Heuristique random");
		System.out.println("   3 : Heuristique a voisinages");
		System.out.println("   4 : Heuristique tabou");
		System.out.println(" Choix pour instances :");
		System.out
				.println("   - un repertoire d'instances pour n'importe quelle heuristique");
		System.out
				.println("   - ou un fichier d'instance pour les heuristiques 3 et 4");
		System.out.println(" Choix pour fichierParamsOptionnel :");
		System.out
				.println("   - un fichier de parametrage de l'heuristique tabou. Il ne sera pas utilise si l'heuristique choisie n'est pas la tabou");
		System.out.println("   - ou aucun fichier");
	}

	private static void lireParams(String cheminParams) {
		System.out
				.println("Lecture du fichier de parametres : " + cheminParams);
		try {
			BufferedReader input = new BufferedReader(new FileReader(
					cheminParams));
			try {
				String line = null;

				while ((line = input.readLine()) != null) {

					// On ne traite la ligne que si elle ne commence pas par //
					if (!line.startsWith("//")) {
						line = line.trim();
						String[] listeParams = line.split("\\s+");
						if (listeParams.length == 2) {
							switch (listeParams[0]) {
							case "DUREE_MAX":
								HeuristiqueTabou.DUREE_MAX = Long
										.parseLong(listeParams[1]);
								System.out.println("  > Nouvelle duree max : " + HeuristiqueTabou.DUREE_MAX);
								break;
							case "MAX_ITER_INUTILES":
								HeuristiqueTabou.MAX_ITER_INUTILES = Integer
										.parseInt(listeParams[1]);
								System.out.println("  > Nouveau nombre d'iterations max : " + HeuristiqueTabou.MAX_ITER_INUTILES);
								break;
							case "SORTIE_MAX_ITER_INUTILES":
								HeuristiqueTabou.SORTIE_MAX_ITER_INUTILES = Boolean
										.parseBoolean(listeParams[1]);
								System.out.println("  > Sortie sur depassement du nombre d'iterations inutiles : " + HeuristiqueTabou.SORTIE_MAX_ITER_INUTILES);
								break;
							case "NB_ITER_MAX":
								HeuristiqueTabou.NB_ITER_MAX = Integer
										.parseInt(listeParams[1]);
								System.out.println("  > Nouveau nombre d'iterations max : " + HeuristiqueTabou.NB_ITER_MAX);
								break;
							case "DUREE_TABOU":
								HeuristiqueTabou.DUREE_TABOU = Integer
										.parseInt(listeParams[1]);
								System.out.println("  > Nouvelle duree tabou : " + HeuristiqueTabou.DUREE_TABOU);
								break;
							default:
								System.err
										.println("Attention, parametre inconnu : "
												+ listeParams[0]);
								break;
							}

						}
					}
				}
			} finally {
				input.close();
				System.out.println();
			}
		} catch (IOException ex) {
			System.err
					.println("Attention, le fichier de parametrage n'existe pas ou est illisible. Utilisation du parametrage par defaut.");
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if (args.length < 2) {
			System.out.println(">>> Pas assez d'arguments ! <<<");
			afficherAide();
			return;
		}

		if (args.length > 3) {
			System.out.println(">>> Trop d'arguments ! <<<");
			afficherAide();
			return;
		}

		String nomFichier = args[1];
		File fichier = new File(nomFichier);
		if (!fichier.exists()) {
			System.out.println(">>> Le fichier d'entree n'existe pas ! <<<");
			afficherAide();
			return;
		}

		// Choix de l'heuristique
		TypeHeuristique type = null;
		switch (args[0]) {
		case "1":
			type = TypeHeuristique.LPT;
			break;
		case "2":
			type = TypeHeuristique.RANDOM;
			break;
		case "3":
			type = TypeHeuristique.VOISINAGE;
			break;
		case "4":
			type = TypeHeuristique.TABOU;
			// S'il y a un troisieme argument, c'est le fichier de parametres
			if (args.length == 3) {
				lireParams(args[2]);
			}
			break;
		default:
			System.out.println(">>>> Heuristique inconnue ! <<<<");
			afficherAide();
			return;
		}

		// Execution de l'heuristique choisie, selon si on fournit une ou
		// plusieurs instances

		File repInstances = null;
		String repertoireParent = null;
	
		if (fichier.isDirectory()) {
			repInstances = fichier;
			repertoireParent = repInstances.getParent();
			System.out.println("rep instance : " + fichier.getAbsolutePath() + " ; et rep parent : " + repertoireParent);
			if (repertoireParent == null) {
				// repertoireParent vaut null si le repertoire d'instances est donne
				// de maniere relative, sans repertoire intermediaire.
				// Par exemple : MainOptiCombi 1 instances
				// Dans cet appel, le repertoire parent de "instances" est null
				// Dans ce cas, le repertoire parent est le repertoire d'execution
				repertoireParent = new File(".").getAbsolutePath();
			}
			MainEnsembleInstances.NOM_ENSEMBLE_INSTANCES = nomFichier;
			MainEnsembleInstances.HEURISTIQUE = type;
			MainEnsembleInstances.exec(repertoireParent);
		} else {
			// Le repertoire instances est le parent de l'instance courante
			repInstances = fichier.getParentFile();
			// Puis le repertoire "parent" est encore au dessus
			repertoireParent = repInstances.getParent();
			if (repertoireParent == null) {
				// repertoireParent vaut null si le repertoire d'instances est donne
				// de maniere relative, sans repertoire intermediaire.
				// Par exemple : MainOptiCombi 1 instances
				// Dans cet appel, le repertoire parent de "instances" est null
				// Dans ce cas, le repertoire parent est le repertoire d'execution
				repertoireParent = new File(".").getAbsolutePath();
			}
			MainInstance.NOM_INSTANCE = nomFichier;
			MainInstance.HEURISTIQUE = type;
			MainInstance.exec(repertoireParent);
		}
	}

}
